<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
// 一般为了区分普通函数与构造函数  要求首字母大写(不是强制，为了好区分)

    function fn(){
        console.log("函数内",this,result instanceof fn); 
    }
    

    // 作为一个普通函数调用
        var result = fn();
        console.log("result",result);
    // 作为一个构造函数调用
        var result = new fn();      
        console.log("result",result);

    // new作为关键词
        // 1.在构造函数内部生成了一个纯净的对象{}   {} instanceof fn => true
        // 2.this指向创建的对象  this -> {}
        // 3.函数指向完毕，默认返回this



    // 改写构造函数     为了解决问题一

    // 问题1. 创建的对象和函数没有关联性
        // 解决办法：创建一个自定义函数 new Fn()

        function Cat(name,color) {
            // this -> {}  指向函数在调用过程中创建的实例化对象
            // 将相关属性和方法  绑定到实例化对象上
            this.name = name,
            this.color = color,
            this.species = "猫", 
            this.call = function(){
                console.log("猫猫");
            },
            this.skill = function(){
                console.log("捉老鼠");
            }
        } 
        var Tom = new Cat("Kitty","white"); // 创建一个实例化对象 赋值给变量Tom
        console.log(Tom);
</script>
</html>